package com.briup.pts.config.response;

import lombok.AccessLevel;
import lombok.Data;
import lombok.RequiredArgsConstructor;

/**
 * 统一响应类型
 */
@Data
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public class Result<T> {
    /**
     * 统一响应状态码，如200表示成功，500表示服务器内部问题
     */
    private final int code;
    /**
     * 响应的消息，如失败的原因
     */
    private final String message;
    /**
     * data用于存放返回给前端的数据
     */
    private final T data;

    private Result(){
        this(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMessage());
    }

    private Result(int code, String message){
        this(code,message,null);
    }

    private Result(T data){
        this(200,"成功",data);
    }

    /**
     * 成功的响应，无返回参数
     * @return 响应结果
     */
    public static Result<Void> success(){
        return new Result<>();
    }

    /**
     * 成功的响应，有返回参数
     * @return 响应结果
     */
    public static <T> Result<T> success(T data){
        return new Result<>(data);
    }

    /**
     * 失败的响应，默认的服务器内部失败响应
     * @return 响应的结果
     */
    public static Result<Void> fail(){
        return new Result<>(500,"服务器内部异常，请联系管理员处理！");
    }

    /**
     * 失败的响应，自定义失败的原因
     * @return 响应的结果
     */
    public static Result<Void> fail(String message){
        return new Result<>(500,String.format("程序内部异常:%s",message));
    }

    /**
     * 失败的响应，自定义失败的响应状态码以及失败的原因
     * @return 响应的结果
     */
    public static Result<Void> fail(int code,String message){
        return new Result<>(code,message);
    }
}
